package com.t.bricks.bussiness.service.wechat.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.t.bricks.bussiness.model.wechat.Answer;
import com.t.bricks.bussiness.service.wechat.SubscribeAccountService;
import com.t.bricks.bussiness.util.wechat.subscribeaccount.TextMessageUtil;
import com.t.bricks.model.Log;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.function.data.SHA1Util;
import com.t.bricks.utils.function.file.FileUtil;
import com.t.bricks.utils.function.json.JacksonShell;
import com.t.bricks.utils.function.url.HttpsUtil;

/**
 * 微信基本业务操作类接口实现
 */
@Service
public class SubscribeAccountServiceImpl implements SubscribeAccountService {
		
	/**
	 * 公众号的appid,同时设置在微信平台
	 */
	@Value("${wechat.appid:去微信平台设置}")
	private String appid;
	
	/**
	 * 公众号的appsecret同时设置在微信平台
	 */
	@Value("${wechat.appsecret:去微信平台设置}")
	private String appsecret;
	
	/**
	 * 默认访问路径
	 */
	@Value("${wechat.subscribe.default.url:默认访问路径}")
	private String subscribeDefaultUrl;

	/**
	 * 默认访问路径名称
	 */
	@Value("${wechat.subscribe.default.url.text:默认访问路径名称}")
	private String subscribeDefaultUrlText;
	
	/**
	 * 验证密钥,同时设置在微信平台
	 */
	@Value("${wechat.token:去微信平台设置}")
	private String token;
	
	/**
	 * 应答信息集合
	 */
	private List<Answer> answerList = null;
	
	/**
	 * 重置应答信息集合
	 */
	@Autowired //初始化应答信息集合
	@Override
	public MsgEmity resetAnswer() {
		String path = new StringBuilder()
			.append(System.getProperty("user.dir").replaceAll("\\\\", "/"))
			.append("/data/rear/answer.json").toString();
		
		MsgEmity me = FileUtil.read(path);
		if (!me.isSuccess()) {
			Log.error(me.getMsg());
			return MsgEmity.err(8001, "设置应答信息集合失败,无法读取内容");
		}
		
		answerList = JacksonShell.toJavaList((String)me.getData(), Answer.class);
		if (null != answerList) {
			return MsgEmity.err(8002, "设置应答信息集合失败,内容解析错误");
		}
		
		return MsgEmity.success("设置应答信息集合成功");
	}
	
	/**
	 * 获取 应答信息集合
	 * @return
	 */
	private List<Answer> getAnswerList() {
		if (null != answerList) {
			return answerList;
		}
		
		answerList = new ArrayList<Answer>(1);
		
		return answerList;
	}
	
	/**
	 * 回应处理
	 * @param map 传入的消息
	 * @return
	 */
	@Override
	public String echo(Map<String,String> map) {
		//将微信请求xml转为map格式，获取所需的参数
		String sToUserName = map.get("ToUserName");		//开发者微信号
		String sFromUserName = map.get("FromUserName");	//发送方帐号
		String sMsgType = map.get("MsgType");			//消息类型
		String sContent = map.get("Content");			//消息内容
		String sEvent = map.get("Event");				//事件类型,subscribe(订阅)、unsubscribe(取消订阅)
		//String sEventKey = map.get("EventKey");			//事件主键,一般在点击菜单时会有
		
		if (null == sContent || "".equals(sContent.trim())) {
			return "";
		}
		
		String resultMsg = null;
		if("text".equals(sMsgType)) {//处理文本类型
			resultMsg = TextMessageUtil.initMessage(sFromUserName, sToUserName,
					analyseTxt(sContent));
			return resultMsg;
		}
		
		if ("event".equals(sMsgType)) {
			if ("subscribe".equals(sEvent)) {
				resultMsg = TextMessageUtil.initMessage(sFromUserName, sToUserName,
						"欢迎您的到来，来了就别走了");
			} else if ("unsubscribe".equals(sEvent)) {
				resultMsg = TextMessageUtil.initMessage(sFromUserName, sToUserName,
						"走好，不送！");
			} else {
				Log.error("无法处理的消息类型:", sMsgType, ";内容:>>", map.toString());
				resultMsg = TextMessageUtil.initMessage(sFromUserName, sToUserName,
						"这个请求还没实现，找时间再说，有意见去找开发员");
			}
			
			return resultMsg;
		}
		
		Log.error("无法处理的消息类型:", sMsgType, ";内容:>>", map.toString());
		resultMsg = TextMessageUtil.initMessage(sFromUserName, sToUserName,
				"您这问题有待研究，先歇着吧");

		return resultMsg;
	}
	
	/**
	 * 分析文本内容,转入特定处理方法
	 * @param msg
	 * @return
	 */
	private String analyseTxt(String msg) {
		if (null == msg || "".equals(msg.trim())) {
			return "……沉默是金！";
		}
		
		if (msg.contains("当前告警数")) {
			return "当前告警数为0，您可以放心了！";
		}
		
		if (msg.contains("取消告警") || (msg.contains("取消") && msg.contains("告警")) ) {
			return "没有指定的告警需要取消，也可能您要取消的告警已经被别的人处理了！";
		}
		
		if (msg.contains("设备数")) {
			return "还没设置过设备信息呢！";
		}
		
		if ("/?/./!/。/？/！/，/、/".contains(msg.trim())) {
			return "不要浪费大家的时间，我的忍耐是有限度的！";
		}
		
		if ("/在吗/在吗？/在吗?/在/在？/在?/求助".contains(msg.trim())) {
			return "有话直说！";
		}
		
		String textIgnoreCase = null;
		String textContains = null;
		for (Answer answer : this.getAnswerList()) {
			if (answer.getsAsk().equals(msg)) {
				return answer.getsAnswer();
			}
			if (answer.getsAsk().equalsIgnoreCase(msg)) {
				textIgnoreCase = answer.getsAnswer();
			}
			if (msg.contains(answer.getsAsk())) {
				textContains = answer.getsAnswer();
			}
		}
		
		if (null != textIgnoreCase) {
			return textIgnoreCase;
		}
		
		if (null != textContains) {
			return textContains;
		}
		
		String text = new StringBuilder()
			.append("虽然我能看懂'").append(msg).append("'这些字,但我还是太笨了，没人教过这个问题怎么回答！\n")
			.append("要不试一下访问这里吧:\n")
			.append("<a href=\"").append(subscribeDefaultUrl).append("\">").append(subscribeDefaultUrlText).append("</a>")
			.toString();
		
		return text;
	}

	/**
	 * 微信端验证链接用接口,已经完整,不用改变
	 * 注意:参数都是腾讯方自动提供,不要尝试自己调用这个接口
	 * @param signature 腾讯自动提供,不要尝试去获取,无意义
	 * @param timestamp 时间戳
	 * @param nonce 随机值
	 * @param echostr 正确时的返回值
	 * @return 正确时返回echostr
	 */
	@Override
	public String check(String signature, String timestamp, String nonce, String echostr) {
		//--根据参数,把在在腾讯平台预定义的TOKEN值和传入的参数进行加密--//
        String[] strArray = {token, timestamp, nonce};//腾讯方要求的排序顺序
        Arrays.sort(strArray);//java自带的排序方法
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }

		String sKey = SHA1Util.encode(sb.toString());//腾讯方要求的排序顺序,腾讯要求用sha1加密
		
		//--校验,将本地加密结果与传入的signature对照,如果双方加密值一致则通信正确--//
		if (sKey == null || sKey == "" || !sKey.equals(signature)) {
			Log.error("腾讯校验签名失败");
			return "";
		}
		
		Log.debug("腾讯校验签名通过");
		
		return echostr;//如果检验成功原样返回echostr，微信服务器接收到此输出，才会确认检验完成。
	}
	
	/**
	 * 微信重定向
	 * @param code 来自腾讯的请求码
	 * @param page 跳转的页面
	 * @return
	 */
	@Override
	public MsgEmity redirect(String code, String page) {
		String URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code"
        		.replace("APPID", appid).replace("SECRET", appsecret).replace("CODE", code);
		MsgEmity me = HttpsUtil.get(URL, null);
		if (!me.isSuccess()) {
			return MsgEmity.err(8001, "请求发生错误");
		}

		Map<String, Object> map = JacksonShell.toJavaObject(me.getData(), Map.class);
		if (null == map) {
			return MsgEmity.err(8002, "未获得相应结果,可能腾讯又改接口了,请联系管理员");
		}
		
		//page = page.replaceAll("/#/", "/%23/");
		
		return new MsgEmity(true, "redirect:STATE".replace("STATE", page), map.get("openid").toString());
	}
	
}
